
package DAO;

import Entidad.ReservaSala;
import Singletons.Mensajes;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

public class ReservaSalaDAO {

    /**
     * <p>Registra en la base de datos una nuevo reserva de sala</p>
     * @param reservasala ReservaSala qua va ha ser guardada en la base de datos
     * @param em EntityManager que se encarga del proceso de guardado
     * @throws PersistenceException
     */
    public void crear(ReservaSala reservasala,EntityManager em) throws PersistenceException {
        try{
            em.persist(reservasala);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Busca en la base de datos la reserva de la sala por su id.</p>
     * @param id
     * @return Reserva de sala cuyo id coincida con el indicado o null si no lo encuentra.
     * @throws PersistenceException
     */
    public ReservaSala buscar(Long id,EntityManager em) throws PersistenceException {
        ReservaSala reservaSala;
        try{
            reservaSala=em.find(ReservaSala.class, id);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return reservaSala;
    }

    /**
     * <p>Actualiza en la base de datos una reserva de sala existente.</p>
     * @param reservasala
     * @return true si se completo la actualizacion de la reserva de la sala, de lo contrario false.
     * @throws PersistenceException
     */
    public void actualizar(ReservaSala nuevo,EntityManager em) throws PersistenceException {
        try{
            em.merge(nuevo);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Elimina de la base de datos la reserva pasada como argumento</p>
     * @param reservaSala
     * @param em EntityManager que se encarga de la conexion con la base de datos
     * @return true si se completo la eliminacion de la reservaSala, de lo contrario false
     * @throws PersistenceException
     */
    public void eliminar(ReservaSala reservaSala,EntityManager em) throws PersistenceException {
        try{
            em.remove(em.merge(reservaSala));
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Elimina de la base de datos la reserva con el id pasado como argumento</p>
     * @param id del la reserva de sala a eliminar
     * @param em EntityManager que se encarga de la conexion con la base de datos
     * @throws PersistenceException
     */
    public void eliminar(long id,EntityManager em) throws PersistenceException {
        try{
            em.remove(em.find(ReservaSala.class,id));
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
    }

    /**
     * <p>Busca en la base de datos todas las reservas de sala</p>
     * @param em EntityManager que se encarga de la conexion con la base de datos
     * @return lista de reservas de salas
     * @throws PersistenceException
     */
    public ArrayList<ReservaSala> lista(EntityManager em) throws PersistenceException {
        ArrayList<ReservaSala> lista=new ArrayList<ReservaSala>();
        try{
            Query consulta = em.createQuery("SELECT u FROM ReservaSala u");
            List listaSalas=consulta.getResultList();
            for(Object r:listaSalas)
                lista.add((ReservaSala)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaSala>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

    /**
     * <p>Busca y retorna una lista de reservas de la sala identificada con el id indicado</p>
     * @param id Long con el id de la sala
     * @param em EntityManager que se encarga de la conexion con la base de datos
     * @return Lista de reservas de la sala con el id pasado como argumento
     * @throws PersistenceException
     */
    public ArrayList<ReservaSala> listaReservasSala(long id,EntityManager em) throws PersistenceException {
        ArrayList<ReservaSala> lista;
        try{
            Query query=em.createQuery("SELECT u FROM ReservaSala u WHERE u.sala.id=:id").setParameter("id",id);
            List listaSalas=query.getResultList();
            lista=new ArrayList<ReservaSala>();
            for(Object r:listaSalas)
                lista.add((ReservaSala)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaSala>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

    /**
     * <p>Busca en la base de datos y retorna todas las reservas pendientes de un profesor.</p>
     * @param profesor String con el nombre del profesor que hizo la reserva
     * @param em EntityManager que se encarga de la conexion con la base de datos
     * @return Lista de reservas activas del profesor
     * @throws PersistenceException
     */
    public ArrayList<ReservaSala> reservasPendientesProfesor(String profesor,EntityManager em) throws PersistenceException {
        ArrayList<ReservaSala> lista;
        try{
            Query query=em.createQuery("SELECT u FROM ReservaSala u WHERE u.profesor=:profesor").setParameter("profesor",profesor);
            lista=new ArrayList<ReservaSala>();
            List listaSalas=query.getResultList();
            for(Object r:listaSalas)
                lista.add((ReservaSala)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaSala>();
        }catch(IllegalArgumentException e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD+" Illegal Query.");
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

}